﻿using System;
using System.Collections.Generic;
using Lenic.DI.Lifetimes;

namespace Lenic.DI.Drivers
{
    /// <summary>
    /// DI 项存储容器接口
    /// </summary>
    public interface IStore : IDisposable, IEnumerable<ILifetime>
    {
        /// <summary>
        /// 添加指定项到容器中。
        /// </summary>
        /// <param name="serviceType">待添加项的类型。</param>
        /// <param name="name">待添加项的名称。</param>
        /// <param name="value">待添加的项。</param>
        void Add(Type serviceType, string name, ILifetime value);

        /// <summary>
        /// 获取指定类型的所有缓存项.
        /// </summary>
        /// <param name="serviceType">待获取的项类型。</param>
        /// <returns>符合条件的所有缓存项。</returns>
        IEnumerable<ILifetime> GetValues(Type serviceType);

        /// <summary>
        /// 尝试从容器中获取指定类型和名称的项。
        /// </summary>
        /// <param name="serviceType">待获取项的类型。</param>
        /// <param name="name">待获取项的名称。</param>
        /// <param name="value">获取到的项.</param>
        /// <returns>
        ///   <c>true</c> 表示获取成功；否则返回 <c>false</c> 。
        /// </returns>
        bool TryGetValue(Type serviceType, string name, out ILifetime value);
    }
}